package eval.results;

/**
 * Interface which contains all the getters and setters used 
 * to collect the results arrays data. 
 * at each array one can find the data on tick i at array[i].
 * 
 * @author Amit Peled   <amit.kapina@gmail.com>
 * @author Igal Kaufman <igal.kaufman@gmail.com> 
 */
public interface IResultsData {

	/**
	 * Get the type of engine 
	 * (i.e. CPLEX/FIRE-FIGHTING/OPEN-STACK).
	 * 
	 * @return the engine type
	 */
	abstract String getEngineType();

	/**
	 * Get the seed  nuber.
	 * 
	 * @return the seed
	 */
	abstract int getSeedNumber();

	/**
	 * Get total reservation on cloud
	 * 
	 * @return total reservation
	 */
	abstract double[] getSumOfMinREservtion();

	/**
	 * Get the total time in second
	 * 
	 * @return Experiment time in second
	 */
	abstract double getTotalExperimentTimeInSec();

	/**
	 * Get the number of host at cloud.
	 *  
	 * @return number of hosts
	 */
	abstract int[] getNumberOfHostAtCloud();

	/**
	 * Get the number of open hosts at cloud.
	 * 
	 * @return number of open hosts
	 */
	abstract int[] getNumberOfOpenHostAtCloud();

	/**
	 * Get the number of close hosts at cloud.
	 * 
	 * @return number of close hosts
	 */
	abstract int[] getNumberOfCloseHostAtCloud();
	/**
	 * Get the number of turn on hosts at cloud.
	 * 
	 * @return number of turn on hosts
	 */
	abstract int[] getNumberOfHostTurnOnAtCloud();

	/**
	 * Get the number of turn off hosts at cloud.
	 * 
	 * @return number of turn off hosts
	 */
	abstract int[] getNumberOfHostTurnOffAtCloud();

	/**
	 * Get the number of hosts that are candidates for closing at cloud.
	 * 
	 * @return number of candidates for closing
	 */
	abstract int[] getNumberOfHostCandidatesForClosing();

	/**
	 * Get the number of VMs at cloud
	 * 
	 * @return number of VMs
	 */
	abstract int[] getNumberOfVmsAtCloud();

	/**
	 * Get the number of VMs that deploy 
	 * 
	 * @return number of VMs that deploy
	 */
	abstract int[] getNumberOfVmsDeploy();

	/**
	 * Get the number of rejected VMs 
	 * 
	 * @return number of rejected VMs 
	 */
	abstract int[] getNumberOfVmsReject();

	/**
	 * Get the number of remove VMs 
	 * 
	 * @return number of remove VMs 
	 */
	abstract int[] getNumberOfVmsRemove();

	/**
	 * Get the number of VMs to be deploy 
	 * 
	 * @return number of VMs to be deploy
	 */
	abstract int[] getNumberOfVmsReqToBeDeploy();

	/**
	 * Get total CPU capacity at cloud
	 * 
	 * @return total CPU capacity
	 */
	abstract int[] getTotalCpuCapcityAtCloud();

	/**
	 * Get total CPU capacity at open hosts
	 * 
	 * @return total CPU capacity 
	 */
	abstract int[] getTotalCpuCapcityAtOpenHosts();

	/**
	 * Get total CPU that use at cloud
	 * 
	 * @return total CPU used 
	 */
	abstract int[] getTotalCpuUseAtCloud();

	/**
	 * Get total CPU that free at cloud
	 * 
	 * @return total CPU free 
	 */
	abstract double[] getTotalCpuFreeAtCloud();

	/**
	 * Get total demand CPU at cloud
	 * 
	 * @return total demand CPU  
	 */
	abstract double[] getTotalCpuDemandAtCloud();

	/**
	 * Get total satisfied CPU demand at cloud
	 * 
	 * @return total satisfied CPU demand   
	 */
	abstract int[] getTotalDemandSatisfiedAtCloud();

	/**
	 * Get total unsatisfied CPU demand at cloud
	 * 
	 * @return total unsatisfied CPU demand   
	 */
	abstract int[] getTotalDemandUnSatisfiedAtCloud();

	/**
	 * Get total MEM capacity at cloud
	 * 
	 * @return total MEM capacity
	 */
	abstract int[] getTotalMemCapcityAtCloud();

	/**
	 * Get total MEM capacity at open hosts
	 * 
	 * @return total MEM capacity 
	 */
	abstract int[] getTotalMemCapcityAtOpenHosts();

	/**
	 * Get total MEM that use at cloud
	 * 
	 * @return total MEM used 
	 */
	abstract int[] getTotalMemUseAtCloud();

	/**
	 * Get total MEM that free at cloud
	 * 
	 * @return total MEM free 
	 */
	abstract int[] getTotalMemFreeAtCloud();

	/**
	 * Get total demand MEM at cloud
	 * 
	 * @return total demand MEM  
	 */
	abstract int[] getTotalMemDemandAtCloud();

	/**
	 * Get number of VMs that have full satisfied
	 * 
	 * @return number of VMs
	 */
	abstract int[] getNumberOfVmsThatHaveFullSatisfied();

	/**
	 * Get number of VMs that have full unsatisfied
	 * 
	 * @return number of VMs
	 */
	abstract int[] getNumberOfVmsThatHaveUnSatisfied();

	/**
	 * computation time of all experiment
	 * 
	 * @return the total time 
	 */
	abstract double[] getComputationTime();

	/**
	 * computation time of all experiment at second
	 * 
	 * @return the total time at second
	 */
	abstract double getTotalExperimentExecutionTimeInSec();

	/**
	 * Return the number of cycles
	 * 
	 * @return number of cycles
	 */
	abstract int getExperimentTicks();

	/**
	 * Get the total request CPU at all experiment
	 * 
	 * @return total request CPU
	 */
	abstract double getTotalRequestCPU();

	/**
	 * Get the total request MEM at all experiment
	 * 
	 * @return total request MEM
	 */
	abstract int getTotalRequestMEM();

	/**
	 * Get number of VMs that have full satisfied
	 * 
	 * @return number of VMs
	 */
	abstract int getTotalNumebrVmWithFullSatisfied();

	/**
	 * Get number of VMs that have unsatisfied
	 * 
	 * @return number of VMs
	 */
	abstract int getTotalNumebrVmWithUnSatisfied();

	/**
	 * Get the $ value of satisfy demand
	 * 
	 * @return total income at $
	 */
	abstract double[] getIncomeFromSatisfyDemand();

	/**
	 * Get the $ value of energy cost of the all experiment
	 * 
	 * @return total cost at $
	 */
	abstract double getTotalCost();

	/**
	 * Get the $ value of income of the all experiment
	 * 
	 * @return total income at $
	 */
	abstract double getTotalIncome();

	/**
	 * Get the total balance of the all experiment at $
	 *  (i.e. TotalCost-TotalIncome)
	 * 
	 * @return balance at $
	 */
	abstract double getBalance();

	/**
	 * get VMs that relocated 
	 * 
	 * @return VMs Relocated
	 */
	abstract int[] getvmRelocate();

	/**
	 * Get base energy consumption of all open host
	 * 
	 * @return base energy consumption at $
	 */
	abstract double[] getBaseEnergyConsumption();

	/**
	 * Get power on energy consumption of all open host
	 * 
	 * @return power on energy consumption at $
	 */
	abstract double[] getPowerOnEnergyConsumption();

	/**
	 * Get load energy consumption of all open host
	 * 
	 * @return load energy consumption at $
	 */
	abstract double[] getLoadEnergyConsumption();

	/**
	 * Get the total balance at $
	 *  (i.e. TotalCost-TotalIncome)
	 * 
	 * @return balance at $
	 */
	abstract double[] getBalanceOfIncome();

	/**
	 * Get the $ value of energy cost 
	 * 
	 * @return total cost at $
	 */
	abstract double[] getTotalConsumption();

	/**
	 * Get the unused CPU at open host
	 * 
	 * @param hostId the host id
	 * @return the unused CPU
	 */
	abstract double[] ggetFreeCpuAtOpenHosts(int hostId);

	/**
	 * Get host capacity
	 * 
	 * @param hostId the host id
	 * @return host capacity
	 */
	abstract int ggetHostCap(int hostId);

	/**
	 * Get the gradient 
	 * 
	 * @return the gradient
	 */
	abstract int[] getGradientValue();

}